<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
//Ultima verificacion: 06-03-2015

//Sirve para validar que una fecha sea valida.
function datecheck($input,$format=""){
	//Separados posibles que puede tener la fecha
	$separator_type= array(
		"/",
		"-",
		"."
	);
	
	//Busco cual es el separador usado en la fecha pasada.
	foreach ($separator_type as $separator) {
		$find= stripos($input,$separator);
		if($find<>false){
			$separator_used= $separator;
		}
	}
	
	//Guardo en un array el dia, mes y año por separado.
	$input_array= explode($separator_used,$input);
	
	//Con la funcion checkdate de php controlo que la fecha sea valida.
	if ($format=="mdy"){
		return checkdate($input_array[0],$input_array[1],$input_array[2]);
	} elseif ($format=="ymd") {
		return checkdate($input_array[1],$input_array[2],$input_array[0]);
	} else {
		return checkdate($input_array[1],$input_array[0],$input_array[2]);
	}
	$input_array=array();
}

class detalleAsistencia extends CI_Controller {
	//Metodo constructor de la clase
	function __construct(){
		parent::__construct();
	}
	
	//Este metodo no se puede llamar con ajax
	//Muestra una tabla con todos los alumnos de una division y si esta presente, ausente, etc segun el tipo de asistencia y fecha pasada por la url.
	function consultar($idCicloLectivo=null, $idTurno=null, $idCurso=null, $idDivision=null, $idTipoAsistencia=null, $dia=null, $mes=null, $anio=null){
		//Primera comprobacion: Que el usuario tenga iniciada la sesion y que tenga permiso para realizar esta accion.
		if($this->session->userdata('sesionIniciada') == 'Si' && ($this->session->userdata('permisoDirector') == '1' || $this->session->userdata('permisoVicedirector') == '1' || $this->session->userdata('permisoSecretario') == '1')){
			//Segunda comprobacion: Que idCicloLectivo pasado sea numerico y mayor o igual que cero. Ademas que idTurno, idCurso, idDivision e idTipoAsistencia sea mayor o igual que cero. Que el dia, mes y año tenga un numero posible.
			if(is_numeric($idCicloLectivo) && $idCicloLectivo>=0 && is_numeric($idTurno) && $idTurno>=0 && is_numeric($idCurso) && $idCurso>=0 && is_numeric($idDivision) && $idDivision>=0 && is_numeric($idTipoAsistencia) && $idTipoAsistencia>=0 && is_numeric($dia) && is_numeric($mes) && is_numeric($anio) && $dia>=1 && $dia<=31 && $mes>=1 && $mes<=12 && $anio>2000 && $anio<2100){
				//Cargo el modelo donde estan los datos de los ciclos lectivos
				$this->load->model('m_ciclo_lectivo');
				
				//Busco al ciclo lectivo para corroborar que exista
				$cicloLectivo = $this->m_ciclo_lectivo->get($idCicloLectivo);
				
				//Cargo el modelo donde estan los datos de los turnos
				$this->load->model('m_turno');
				
				//Busco al turno para corrobar que exista
				$turno = $this->m_turno->get($idTurno);
				
				//Cargo el modelo donde estan los datos de los cursos
				$this->load->model('m_curso');
				
				//Busco al curso para comprobar que existe
				$curso = $this->m_curso->get($idCurso);
				
				//Cargo el modelo donde estan los datos de las divisiones
				$this->load->model('m_division');
				
				//Busco a la division para comprobar que existe
				$division = $this->m_division->get($idDivision);
				
				//Cargo el modelo donde estan los datos de los tipos de asistencia
				$this->load->model('m_tipo_asistencia');
				
				//Busco al tipo de asistencia para comprobar que existe
				$tipoAsistencia = $this->m_tipo_asistencia->get($idTipoAsistencia);
				
				//Tercera comprobacion: Que el idCicloLectivo pasado por la url sea existente o bien igual a cero. Lo mismo para el turno, curso, division y tipo de asistencia. 
				if(($cicloLectivo->num_rows() == 1 || $idCicloLectivo==0) && ($turno->num_rows() == 1 || $idTurno==0) && ($curso->num_rows() == 1 || $idCurso==0) && ($division->num_rows() == 1 || $idDivision==0) && ($tipoAsistencia->num_rows() == 1 || $idTipoAsistencia==0)){
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Busco todos los ciclos lectivos
					$listadoCiclosLectivos = $this->m_ciclo_lectivo->buscar();
					
					//Le paso el listado de todos los ciclos lectivos a la vista para que los muestre en un combo de filtrado
					$datos['ciclosLectivos'] = $listadoCiclosLectivos;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Busco todos los turnos activos
					$listadoTurnos = $this->m_turno->buscarActivos();
					
					//Le paso el listado de todos los turnos a la vista para que los muestre en un combo de filtrado
					$datos['turnos'] = $listadoTurnos;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Si el ciclo lectivo pasado por la url es igual a cero entonces hay que seleccionar el ciclo vigente, en caso contrario el que haya sido pasado
					if($idCicloLectivo==0){
						//Busco el ciclo lectivo vigente
						$cicloLectivoVigente = $this->m_ciclo_lectivo->getVigente();
						
						if($cicloLectivoVigente->num_rows() == 1){
							//Le paso a la vista el id del ciclo lectivo vigente
							$datos['idCicloLectivoSel'] = $cicloLectivoVigente->row()->idCicloLectivo;
						}else{
							//No hay ciclo lectivo seleccionado ni vigente
							$datos['idCicloLectivoSel'] = 0;
						}
					}else{
						//Le paso a la vista el id del ciclo lectivo pasado por la url
						$datos['idCicloLectivoSel'] = $idCicloLectivo;
					}
					
					//Le paso a la vista el id del turno
					$datos['idTurnoSel'] = $idTurno;
					
					//Le paso a la vista el id del curso
					$datos['idCursoSel'] = $idCurso;
					
					//Le paso a la vista el id de la division
					$datos['idDivisionSel'] = $idDivision;
					
					//Le paso a la vista el id del tipo de asistencia
					$datos['idTipoAsistenciaSel'] = $idTipoAsistencia;
					
					//Le paso a la vista la fecha en diversos formatos
					$datos['fechaSel'] = $dia."/".$mes."/".$anio;
					$datos['fecha2Sel'] = $dia."-".$mes."-".$anio;
					$datos['fecha3Sel'] = $anio."-".$mes."-".$dia;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Restricciones a los cursos, divisiones y alumnosxdivision
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					$restriccion1 = "";
					$restriccion2 = "";
					$restriccion3 = "";					
					if($idCicloLectivo==0){
						//Busco el ciclo lectivo vigente
						$cicloLectivoVigente = $this->m_ciclo_lectivo->getVigente();
						
						if($cicloLectivoVigente->num_rows() == 1){
							$restriccion1 = " AND curso.idCicloLectivo=".$cicloLectivoVigente->row()->idCicloLectivo;
						}else{
							$restriccion1 = " AND curso.idCicloLectivo=0";
						}
					}else{
						$restriccion1 = " AND curso.idCicloLectivo=".$idCicloLectivo;					
					}
					
					if($idTurno!=0){
						$restriccion1 .= " AND curso.idTurno=".$idTurno;
					}
					
					$restriccion2 = " AND division.idCurso=".$idCurso;
					$restriccion3 = " AND alumnoxdivision.idDivision=".$idDivision;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Cargo el modelo donde estan los datos de los cursos registrados para pedirle un listado con todos ellos
					$this->load->model('m_curso');
					
					//Busco todos los cursos activos segun las restricciones
					$listadoCursos = $this->m_curso->buscarActivos($restriccion1);
					
					//Le paso el listado de todos los cursos a la vista para que los muestre en un combo de filtrado
					$datos['cursos'] = $listadoCursos;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Cargo el modelo donde estan los datos de las divisiones registradas para pedirle un listado con todas ellas
					$this->load->model('m_division');
					
					//Busco todas las divisiones activas segun las restricciones
					$listadoDivisiones = $this->m_division->buscarActivos($restriccion1 . $restriccion2);
					
					//Le paso el listado de todas las divisiones a la vista para que los muestre en un combo
					$datos['divisiones'] = $listadoDivisiones;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Cargo el modelo donde estan los datos de los alumnos x division registrados para pedirle un listado con todos ellas
					$this->load->model('m_alumnoxdivision');
					
					//Busco todos los alumnos de la division pasada por la url activos
					$listadoAlumnos = $this->m_alumnoxdivision->buscar($restriccion3);
					
					//Le paso el listado de todos los alumnos a la vista para que los muestre en la tabla
					$datos['alumnos'] = $listadoAlumnos;
					
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//Carlos el modelo donde estan los datos de los tipos de asistencias
					$this->load->model('m_tipo_asistencia');
					
					//Busco todos los tipos de asistencias activos
					$listadoTiposAsistencias = $this->m_tipo_asistencia->buscarActivos();
					
					//Le paso el listado de todos los tipos de asistencias a la vista para que los muestre en un combo de filtrado
					$datos['tiposAsistencias'] = $listadoTiposAsistencias;
					
					//Carlos el modelo donde estan los datos de los tipos de inasistencias
					$this->load->model('m_tipo_inasistencia');
					
					//Busco todos los tipos de inasistencias activos
					$listadoTiposInasistencias = $this->m_tipo_inasistencia->buscarActivos();
					
					//Le paso el listado de todos los tipos de inasistencias a la vista para que los muestre en la tabla
					$datos['tiposInasistencias'] = $listadoTiposInasistencias;
										
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////					
					//Cargo el modelo donde estan los datos de los detalles de asistencia registradas para utilizar sus funciones en la vista
					$this->load->model('m_detalle_asistencia');
					
					//Cargo la vista donde se muestra la tabla de detalles de la asistencias y la guardo en una variable para pasarsela a la vista principal
					$datosPrincipal['vista'] = $this->load->view('v_detalles_asistencias', $datos, true);
					
					//Cargo la vista principal con los datos de la vista recien generada
					$this->load->view('v_sistema', $datosPrincipal);
				} else {
					//El o los registros no existen.
					//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
					$this->session->sess_destroy();
					//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
					redirect(site_url("inicio"));
				}
			} else {
				//Los parametros pasados no son validos para consultar los registros.
				//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
				$this->session->sess_destroy();
				//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
				redirect(site_url("inicio"));
			}
		} else {
			//El usuario no tiene permiso para realizar esta accion.
			//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
			$this->session->sess_destroy();
			//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
			redirect(site_url("inicio"));
		}
	}
	
	
	
	//Este metodo no se puede llamar con ajax
	//Este metodo realmente modifica los datos de la toma de asistencias. Si ya esta creada hay que modificarla. Caso contrario, hay que crearla.
	function modificar($idDivision=null, $idTipoAsistencia=null, $fecha=null){
	    //Primera comprobacion: Que el usuario tenga iniciada la sesion y que tenga permiso para realizar esta accion.
		if($this->session->userdata('sesionIniciada') == 'Si' && ($this->session->userdata('permisoDirector') == '1' || $this->session->userdata('permisoVicedirector') == '1' || $this->session->userdata('permisoSecretario') == '1')){	   
			//Segunda comprobacion: Que se haya pasado por url la division, tipo de asistencia y fecha de los detalles de asistencias a crear o modificar. 
			//Ademas que se haya pasado por post el estado de los detalle de asistencias (si esta presente, ausente, etc y si es justificada o no)
			if(is_numeric($idDivision) && $idDivision>0 && is_numeric($idTipoAsistencia) && $idTipoAsistencia>0 && $fecha!=""){								
				//Cargo el modelo donde estan los datos de las divisiones
				$this->load->model('m_division');
				
				//Busco a la division para comprobar que existe
				$division = $this->m_division->get($idDivision);
				
				//Cargo el modelo donde estan los datos de los tipos de asistencia
				$this->load->model('m_tipo_asistencia');
				
				//Busco al tipo de asistencia para comprobar que existe
				$tipoAsistencia = $this->m_tipo_asistencia->get($idTipoAsistencia);
				
				//Valido que la fecha sea correcta
				$fechaCorrecta = datecheck($fecha, "ymd");
				
				//Tercera comprobacion: Que la division pasada por la url sea existente. Lo mismo para el tipo de asistencia. Que la fecha tenga el formato correcto.
				if($division->num_rows() == 1 && $tipoAsistencia->num_rows() == 1 && $fechaCorrecta===true){
					//Busco si ya hay creada una toma de asistencia para los parametros pasados o no.
					//Cargo el modelo donde estan los datos de las asistencias
					$this->load->model('m_asistencia');
					
					//Busco a la asistencia para ver si ya fue tomada una asistencia con los parametros pasados o no.
					$asistencia = $this->m_asistencia->get2($idDivision, $idTipoAsistencia, $fecha);
					
					$ultimaAsistenciaCreada = 0;
					//Si no se ha tomado la asistencia, creamos el registro.
					if($asistencia->num_rows() != 1){
						//Creamos la asistencia
						$resultado = $this->m_asistencia->crear($idDivision, $idTipoAsistencia, $fecha, null, 1, $this->session->userdata('idUsuarioLog'));
						
						if($resultado==1){
							//Ultima asistencia creada
							$ultimaAsistenciaCreada = $this->db->insert_id();
						}
					}
					
					//Buscamos todos los alumnos de la division pasada
					$restriccion = " AND alumnoxdivision.idDivision=".$idDivision;
					
					//Cargo el modelo donde estan los datos de los alumnos x division registrados para pedirle un listado con todas ellas
					$this->load->model('m_alumnoxdivision');
					
					//Busco todos los alumnos de la division pasada por la url activos
					$listadoAlumnos = $this->m_alumnoxdivision->buscar($restriccion);
					
					//Cargo el modelo donde estan los datos de las detalles de asistencia
					$this->load->model('m_detalle_asistencia');
					
					//Cargo el modelo donde estan los datos del timeline para cargar la novedad.
					$this->load->model('m_timeline');
					
					//Si el resultado al final es mayor que cero es porque algo se modifico
					$resultado = 0;
					
					//Recorremos el listado de alumnos para verificar cada uno y si esta presente, ausente, etc y si es justificada o no.
					foreach ($listadoAlumnos->result() as $alumno){
						//Busco en la base de datos si ya se creo un registro para el alumno de la division en la fecha y tipo de asistencia seleccionada
						$detalle = $this->m_detalle_asistencia->get2($alumno->idAxD, $idDivision, $idTipoAsistencia, $fecha);
						
						$just = 0;
						if($this->input->post('axdj_'.$alumno->idAxD,true) == "on"){
							$just = 1;
						}
						
						//Ya esta creado el detalle: la actualizo en la base de datos
						if($detalle->num_rows() == 1){
							$resultado += $this->m_detalle_asistencia->modificar($detalle->row()->idDetalleAsistencia, $this->input->post('axd_'.$alumno->idAxD,true),$just, $detalle->row()->descripcion);
						
							//Creamos el registro de la novedad. TipoOperacion, idTablaOrigen, idRegistroOrigen, idTablaDestino, idRegistroDestino, fechaPasada, fechaFutura, estado
							$this->m_timeline->crear(2, 2, $detalle->row()->idDetalleAsistencia, 21, $alumno->idAlumno, date("Y-m-d H:i:s") ,null, 1);
						//No esta creado el detalle: la guardo en la base de datos
						} else {
							if($ultimaAsistenciaCreada>0){
								$resultado += $this->m_detalle_asistencia->crear($ultimaAsistenciaCreada, $alumno->idAxD, $this->input->post('axd_'.$alumno->idAxD,true), $just, null, 1,  $this->session->userdata('idUsuarioLog'));							
						
								//Ultimo detalle de asistencia creada
								$ultimoDetalleAsistenciaCreado = $this->db->insert_id();
								
								if($ultimoDetalleAsistenciaCreado>0){
									//Creamos el registro de la novedad. TipoOperacion, idTablaOrigen, idRegistroOrigen, idTablaDestino, idRegistroDestino, fechaPasada, fechaFutura, estado
									$this->m_timeline->crear(1, 2, $ultimoDetalleAsistenciaCreado, 21, $alumno->idAlumno, date("Y-m-d H:i:s") ,null, 1);
								}
							}
						}
					}
								
					if($resultado >= 1){
						echo("<script> alert('La toma de asistencia se ha modificado correctamente.');</script>");
					}else{
						echo("<script> alert('La toma de asistencia no se ha modificado. Ha habido un error o los datos permanecieron iguales.');</script>");
					}
				} else {
					//El o los registros no existen.
					//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
					$this->session->sess_destroy();
					//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
					redirect(site_url("inicio"));
				}
			} else {
				//Los parametros pasados no son validos para modificar un registro.
				//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
				$this->session->sess_destroy();
				//Lo redirigimos al login ya que como no se llamo con ajax se puede redirigir.
				redirect(site_url("inicio"));
			}
		} else {
			//El usuario no tiene permiso para realizar esta accion.
			//Destruimos la sesion ya que si llego hasta aca lo hizo mediante alguna tecnica no apropiada y no utilizando la interfaz del sistema.
			$this->session->sess_destroy();			
		}
	}
}